/*
 * Motor.c
 *
 *  Created on: 2023年12月22日
 *      Author: Administrator
 *      注：用程序模拟电机运行，会遇到电机并行处理的问题，如果轮次动作，会不可避免的出现先后问题。
 *      改用定时器来调动电机
 *      设定几个参数：
 *      1.标记电机当前位置
 *      2.标志电机目标位置
 *      3.记录电机要走的步数
 *      4.一步八个节拍，考虑如何用计时器来实现这八个节拍；
 */

#include "common_api.h"

/**
 * A电机旋转
 * @param num
 */
//void A_Rotate(uint8_t num)
//{
//    switch(num)
//    {
//        //八个节拍是一个步进角
//
//       // 1     4
//       // 2     3
//
//
//        case 0:
//            DJA1_HIGH;DJA4_HIGH;DJA3_LOW;DJA2_LOW;
//
//        break;
//        case 1:
//            DJA1_LOW;DJA4_HIGH;DJA3_LOW;DJA2_LOW;
//
//        break;
//        case 2:
//            DJA1_LOW;DJA4_HIGH;DJA3_HIGH;DJA2_LOW;
//
//        break;
//        case 3 :
//            DJA1_LOW;DJA4_LOW;DJA3_HIGH;DJA2_LOW;
//
//        break;
//        case 4:
//            DJA1_LOW;DJA4_LOW;DJA3_HIGH;DJA2_HIGH;
//
//        break;
//        case 5:
//            DJA1_LOW;DJA4_LOW;DJA3_LOW;DJA2_HIGH;
//
//        break;
//        case 6:
//            DJA1_HIGH;DJA4_LOW;DJA3_LOW;DJA2_HIGH;
//
//        break;
//        case 7:
//            DJA1_HIGH;DJA4_LOW;DJA3_LOW;DJA2_LOW;
//        break;
//
//        default :
//            DJA1_LOW;DJA4_LOW;DJA3_LOW;DJA2_LOW;
//        break;
//    }
//}
///**
// * B电机旋转
// * @param num
// */
//void B_Rotate(uint8_t num)
//{
//    switch(num)
//    {
//        //八个节拍是一个步进角
//
//       // 1     4
//       // 2     3
//        case 0:
//            DJB1_HIGH;DJB4_HIGH;DJB3_LOW;DJB2_LOW;
//
//        break;
//        case 1:
//            DJB1_LOW;DJB4_HIGH;DJB3_LOW;DJB2_LOW;
//
//        break;
//        case 2:
//            DJB1_LOW;DJB4_HIGH;DJB3_HIGH;DJB2_LOW;
//
//        break;
//        case 3 :
//            DJB1_LOW;DJB4_LOW;DJB3_HIGH;DJB2_LOW;
//
//        break;
//        case 4:
//            DJB1_LOW;DJB4_LOW;DJB3_HIGH;DJB2_HIGH;
//
//        break;
//        case 5:
//            DJB1_LOW;DJB4_LOW;DJB3_LOW;DJB2_HIGH;
//
//        break;
//        case 6:
//            DJB1_HIGH;DJB4_LOW;DJB3_LOW;DJB2_HIGH;
//
//        break;
//        case 7:
//            DJB1_HIGH;DJB4_LOW;DJB3_LOW;DJB2_LOW;
//        break;
//
//        default :
//            DJB1_LOW;DJB4_LOW;DJB3_LOW;DJB2_LOW;
//        break;
//    }
//}
void Motor_init(void)
{
	BEEP_ON;
	A_Change(0, Motor_Range);
    B_Change(0, Motor_Range);
    Consume_AStep();
    Consume_BStep();
	
    Delay_ms(200);
	BEEP_OFF;
	A_Change(Motor_Range, 0);
    B_Change(Motor_Range, 0);
    Consume_AStep();
    Consume_BStep();
}
void A_Change(uint8_t Now,uint8_t Target)
{

       if(Now <= (Target - 3))      //小于三步不动
       {
           MotorA.NowDir = Now;
           MotorA.TarGet = Target;
           MotorA.Direction = 1;
           MotorA.Step = Target - Now;
		   motorA_Flag =1;
		   
       }
       else if(Now >= (Target + 3))
       {
           MotorA.NowDir = Now;
           MotorA.TarGet = Target;
           MotorA.Direction = 0;
           MotorA.Step =  Now - Target ;
		   motorA_Flag =1;
       }
	   else
	   {
			motorA_Flag = 0;
	   }
	
}
void Consume_AStep(void)
{
	if(motorA_Flag)
	{
		    while(MotorA.Step);             //在计时器里吃掉多余的步长
			MotorA.NowDir = MotorA.TarGet; //消耗掉步长之后，位置变更	
	}

}
void B_Change(uint8_t Now,uint8_t Target)
{

       if(Now <= (Target - 3))      //小于三步不动
       {
           MotorB.NowDir = Now;
           MotorB.TarGet = Target;
           MotorB.Direction = 1;
           MotorB.Step = Target - Now;
		   motorB_Flag =1;
       }
       else if(Now >= (Target + 3))
       {
           MotorB.NowDir = Now;
           MotorB.TarGet = Target;
           MotorB.Direction = 0;
           MotorB.Step =  Now - Target ;
		   motorB_Flag =1;
       }
	   else
	   {
		   motorB_Flag =0;
	   }

}
void Consume_BStep(void)
{
		if(motorB_Flag)
		{
		    while(MotorB.Step);             //在计时器里吃掉多余的步长
			MotorB.NowDir = MotorB.TarGet; //消耗掉步长之后，位置变更		
		}
}
/**
 * 电机动作综合
 */
void Motor_Move(void)
{
    A_Change(MotorA.NowDir, MotorA.TarGet);
    B_Change(MotorB.NowDir, MotorB.TarGet);
    Consume_AStep();
    Consume_BStep();
}
/**
 * 电机归零
 */
void Motor_Zero(void)
{
    A_Change(MotorA.NowDir, 0);
    B_Change(MotorB.NowDir, 0);
    Consume_AStep();
    Consume_BStep();
}
/**
 *  这个是别的仪表的步进电机节拍，测试用
 * @param num
 */
void A_Rotate(uint8_t num)
{
    switch(num)
    {
        //八个节拍是一个步进角

       // 1     3
       // 4     2


        case 0:
            DJA1_HIGH;DJA3_HIGH;DJA2_LOW;DJA4_LOW;

        break;
        case 1:
            DJA1_LOW;DJA3_HIGH;DJA2_LOW;DJA4_LOW;

        break;
        case 2:
            DJA1_LOW;DJA3_HIGH;DJA2_HIGH;DJA4_LOW;

        break;
        case 3 :
            DJA1_LOW;DJA3_LOW;DJA2_HIGH;DJA4_LOW;

        break;
        case 4:
            DJA1_LOW;DJA3_LOW;DJA2_HIGH;DJA4_HIGH;

        break;
        case 5:
            DJA1_LOW;DJA3_LOW;DJA2_LOW;DJA4_HIGH;

        break;
        case 6:
            DJA1_HIGH;DJA3_LOW;DJA2_LOW;DJA4_HIGH;

        break;
        case 7:
            DJA1_HIGH;DJA3_LOW;DJA2_LOW;DJA4_LOW;
        break;

        default :
            DJA1_LOW;DJA3_LOW;DJA2_LOW;DJA4_LOW;
        break;
    }
}
/**
 *  这个是别的仪表的步进电机节拍，测试用
 * @param num
 */
void B_Rotate(uint8_t num)
{
    switch(num)
    {
        //八个节拍是一个步进角

       // 1     3
       // 4     2


        case 0:
            DJB1_HIGH;DJB3_HIGH;DJB2_LOW;DJB4_LOW;

        break;
        case 1:
            DJB1_LOW;DJB3_HIGH;DJB2_LOW;DJB4_LOW;

        break;
        case 2:
            DJB1_LOW;DJB3_HIGH;DJB2_HIGH;DJB4_LOW;

        break;
        case 3 :
            DJB1_LOW;DJB3_LOW;DJB2_HIGH;DJB4_LOW;

        break;
        case 4:
            DJB1_LOW;DJB3_LOW;DJB2_HIGH;DJB4_HIGH;

        break;
        case 5:
            DJB1_LOW;DJB3_LOW;DJB2_LOW;DJB4_HIGH;

        break;
        case 6:
            DJB1_HIGH;DJB3_LOW;DJB2_LOW;DJB4_HIGH;

        break;
        case 7:
            DJB1_HIGH;DJB3_LOW;DJB2_LOW;DJB4_LOW;
        break;

        default :
            DJB1_LOW;DJB3_LOW;DJB2_LOW;DJB4_LOW;
        break;
    }
}

/**
 * 根据目标位置和当前位置，电机A向前或向后
 * 位置范围自定义
 * @param Now  起始位置
 * @param Target  目标位置
 * @param speed 改变此参数来改变电机速度 越小越快
 */
/*
void A_Change(uint8_t Now,uint8_t Target,uint8_t speed)
{
    uint8_t i,j,Num;
    if(Now >= Target)   //往回走
    {
        Num = Now - Target;
        for(j=0;j<Num;j++)
         {
             for(i=0;i<=7;i++)
             {
                    A_Rotate(i);
                    Delay_ms(speed);
             }
         }
    }
    else        //往前走
    {
        Num = Target - Now;

        for(j=0; j<Num; j++)
                {
                   for(i=8;i>0;i--)    //考虑到0再往下减可能会变成255
                    {
                         A_Rotate(i-1);
                         Delay_ms(speed);
                    }
                }
    }

    MotorA_NowDir = MotorA_TargetDir;
}
*/
/**
 * 根据目标位置和当前位置，电机B向前或向后
 * @param Now  起始位置
 * @param Target  目标位置
 * @param speed 改变此参数来改变电机速度 越小越快
 */
/*
void B_Change(uint8_t Now,uint8_t Target,uint8_t speed)
{
    uint8_t i,j,Num;
    if(Now >= Target)   //往回走
    {
        Num = Now - Target;
        for(j=0;j<Num;j++)
         {
             for(i=0;i<=7;i++)
             {
                    B_Rotate(i);
                    Delay_ms(speed);
             }
         }
    }
    else        //往前走
    {
        Num = Target - Now;

        for(j=0; j<Num; j++)
         {
              for(i=8;i>0;i--)    //考虑到0再往下减可能会变成255
              {
                   B_Rotate(i-1);
                   Delay_ms(speed);
              }
         }
    }

    MotorB_NowDir = MotorB_TargetDir;
}
*/
